package com.cty.sparseArray;
/*
* 学习稀疏数组的转化和回转
* 应用场景：五子棋的棋盘
* 作用：可以节约磁盘空间
* */

import java.io.*;

public class sparseArray {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //初始化原数组(棋盘数组)，11行×11列的数组
        int [][] chessArr1 =new int[11][11];
        //1代表黑子，2代表白子
        chessArr1[1][2]=1;
        chessArr1[2][3]=2;
        chessArr1[4][5]=2;
        System.out.println("原棋盘数组~~~~");
        //输出原数组看效果
        for (int i = 0; i < chessArr1.length; i++) {
            for (int j = 0; j < chessArr1[i].length; j++) {
                System.out.print(chessArr1[i][j]+"\t");
            }
            System.out.println();
        }
        //开始转化为稀疏数组
        //1.得到有效值的数目
        int sum=0;
        for (int i = 0; i < chessArr1.length; i++) {
            for (int j = 0; j < chessArr1[i].length; j++) {
                if(chessArr1[i][j] !=0){
                    sum++;
                }
            }
        }
        //创建稀疏数组
        int [][] sparseArr=new int[sum+1][3];
        //填入稀疏数组的值
        sparseArr[0][0]=chessArr1.length;
        sparseArr[0][1]=chessArr1[0].length;
        sparseArr[0][2]=sum;
        //遍历寻找有效值
        int count=0;//有效值数的递增值
        for (int i = 0; i < chessArr1.length; i++) {
            for (int j = 0; j < chessArr1[i].length; j++) {
                if(chessArr1[i][j] !=0){
                    count++;
                    sparseArr[count][0]=i;
                    sparseArr[count][1]=j;
                    sparseArr[count][2]=chessArr1[i][j];
                }
            }
        }
        //稀疏数组写入到文件中(用对象输入流来实现)（序列化）
        String filePath="D:\\javaCode\\DataStructuresAndAlgorithms\\map.data";
        ObjectOutputStream oos= new ObjectOutputStream(new FileOutputStream(filePath));
        //将稀疏数组写入到文件中
        oos.writeObject(sparseArr);
        System.out.println("写入成功");
        //将稀疏数组写入到程序中（反序列化）
        ObjectInputStream ois= new ObjectInputStream(new FileInputStream(filePath));
        //读取对象
        Object o = ois.readObject();
        int [][]sparseArr2=(int[][]) o;//将object向下转型为二维数组
        System.out.println("转化成的稀疏数组~~");
        for (int i = 0; i <sparseArr2.length ; i++) {
            System.out.println(sparseArr2[i][0]+"\t"+sparseArr2[i][1]+"\t"+sparseArr2[i][2]);
        }
        //将稀疏数组转化为原数组
        int [][] chessArr2=new int [sparseArr2[0][0]][sparseArr2[0][1]];
        //将稀疏数组的值填入转化的数组中
        for (int i = 1; i < sparseArr2.length; i++) {
             chessArr2[sparseArr2[i][0]][sparseArr2[i][1]]=sparseArr2[i][2];
        }
        //遍历转化为正常的数组
        System.out.println("遍历转化后的数组~~~~");
        for (int i = 0; i < chessArr2.length; i++) {
            for (int j = 0; j < chessArr2[i].length; j++) {
                System.out.print(chessArr2[i][j]+"\t");
            }
            System.out.println();
        }
    }
}
